home *** CD-ROM | disk | FTP | other *** search
/ Programming a Multiplayer FPS in DirectX / Programming a Multiplayer FPS in DirectX (Companion CD).iso / DirectX / dxsdk_oct2004.exe / dxsdk.exe / Samples / C++ / DirectInput / DIConfig / selcontroldlg.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2004-09-27  |  3.3 KB  |  156 lines

  1. #include "common.hpp"
  2.  
  3.  
  4. CSelControlDlg::CSelControlDlg(CDeviceView &view, CDeviceControl &control, BOOL bReselect, DWORD dwOfs, const DIDEVICEINSTANCEW &didi) :
  5.     m_bReselect(bReselect), m_dwOfs(dwOfs), m_didi(didi),
  6.     m_view(view), m_control(control), m_bAssigned(FALSE), m_bNoItems(TRUE)
  7. {
  8. }
  9.  
  10. CSelControlDlg::~CSelControlDlg()
  11. {
  12. }
  13.  
  14. int CSelControlDlg::DoModal(HWND hParent)
  15. {
  16.     return CFlexWnd::DoModal(hParent, IDD_SELCONTROLDLG, g_hModule);
  17. }
  18.  
  19. BOOL CALLBACK AddItem(LPCDIDEVICEOBJECTINSTANCE lpddoi, LPVOID pvRef)
  20. {
  21.     if (pvRef == NULL || lpddoi == NULL)
  22.         return DIENUM_CONTINUE;
  23.     return ((CSelControlDlg *)pvRef)->AddItem(*lpddoi);
  24. }
  25.  
  26. BOOL CSelControlDlg::AddItem(const DIDEVICEOBJECTINSTANCE &doi)
  27. {
  28.     if (m_hList == NULL || m_view.DoesCalloutOtherThanSpecifiedExistForOffset(&m_control, doi.dwType))
  29.         return DIENUM_CONTINUE;
  30.  
  31.     LRESULT i = SendMessage(m_hList, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)doi.tszName);
  32.     if (i == LB_ERR || i == LB_ERRSPACE)
  33.         return DIENUM_CONTINUE;
  34.  
  35.     m_bNoItems = FALSE;
  36.  
  37.     i = SendMessage(m_hList, LB_SETITEMDATA, (WPARAM)i, (LPARAM)doi.dwType);
  38.  
  39.     return DIENUM_CONTINUE;
  40. }
  41.  
  42. void CSelControlDlg::OnInit()
  43. {
  44.     m_hList = GetDlgItem(m_hWnd, IDC_LIST);
  45.     if (m_hList == NULL)
  46.         return;
  47.  
  48.     LPDIRECTINPUTDEVICE8 pDID = NULL;
  49.     LPDIRECTINPUT8 pDI = NULL;
  50.     DWORD dwVer = DIRECTINPUT_VERSION;
  51.     HRESULT hr;
  52.     if (FAILED(hr = DirectInput8Create(g_hModule, dwVer, IID_IDirectInput8, (LPVOID*)&pDI, NULL)))
  53.         return;
  54.  
  55.     if (FAILED(hr = pDI->CreateDevice(m_didi.guidInstance, &pDID, NULL)))
  56.     {
  57.         pDID = NULL;
  58.         return;
  59.     }
  60.  
  61.     pDI->Release();
  62.     pDI = NULL;
  63.  
  64.     if (FAILED(hr = pDID->EnumObjects(::AddItem, this, DIDFT_AXIS | DIDFT_BUTTON | DIDFT_POV)))
  65.         return;
  66.  
  67.     pDID->Release();
  68.     pDID = NULL;
  69.  
  70.     if (m_bNoItems)
  71.     {
  72.         EndDialog(SCDR_NOFREE);
  73.         return;
  74.     }
  75.  
  76.     // indicate callout offset assignment...
  77.     int i = -1;
  78.  
  79.     if (m_control.IsOffsetAssigned())
  80.     {
  81.         BOOL m_bAssigned = TRUE;
  82.         m_dwOfs = m_control.GetOffset();
  83.         i = GetItemWithOffset(m_dwOfs);
  84.     }
  85.  
  86.     SendMessage(m_hList, LB_SETCURSEL, (WPARAM)i, 0);
  87. }
  88.  
  89. LRESULT CSelControlDlg::OnCommand(WORD wNotifyCode, WORD wID, HWND hWnd)
  90. {
  91.     switch (wNotifyCode)
  92.     {
  93.         case LBN_SELCHANGE:
  94.         {
  95.             if (m_hList == NULL || m_hList != hWnd)
  96.                 break;
  97.  
  98.             LRESULT lr = SendMessage(m_hList, LB_GETCURSEL, 0, 0);
  99.             if (lr == LB_ERR)
  100.                 break;
  101.  
  102.             lr = SendMessage(m_hList, LB_GETITEMDATA, (WPARAM)lr, 0);
  103.             if (lr == LB_ERR)
  104.                 break;
  105.  
  106.             m_dwOfs = (DWORD)lr;
  107.             m_bAssigned = TRUE;
  108.             break;
  109.         }
  110.  
  111.         case BN_CLICKED:
  112.             switch (wID)
  113.             {
  114.                 case IDOK:
  115.                     if (m_bAssigned)
  116.                         EndDialog(SCDR_OK);
  117.                     else
  118.                         MessageBox(m_hWnd, TEXT("You must either select a control for this callout or click cancel."), TEXT("Select a Control"), MB_OK);
  119.                     break;
  120.  
  121.                 case IDCANCEL:
  122.                     EndDialog(SCDR_CANCEL);
  123.                     break;
  124.             }
  125.             break;
  126.     }
  127.  
  128.     return 0;
  129. }
  130.  
  131. int CSelControlDlg::GetItemWithOffset(DWORD dwOfs)
  132. {    
  133.     if (m_hList == NULL)
  134.         return -1;
  135.  
  136.     LRESULT lr = SendMessage(m_hList, LB_GETCOUNT, 0, 0);
  137.     if (lr == LB_ERR)
  138.         return -1;
  139.  
  140.     int n = int(lr);
  141.  
  142.     if (n < 1)
  143.         return -1;
  144.  
  145.     for (int i = 0; i < n; i++)
  146.     {
  147.         lr = SendMessage(m_hList, LB_GETITEMDATA, (WPARAM)i, 0);
  148.         if (lr == LB_ERR)
  149.             continue;
  150.  
  151.         if ((DWORD)lr == dwOfs)
  152.             return i;
  153.     }
  154.     return -1;
  155. }
  156.